import java.util.*;

/**
 * @description:
 * @Author: wuzhenbin
 * @CreateTime: 2025/2/16
 */
public class leetcode_347 {
    public static void main(String[] args) {

    }

    public int[] topKFrequent(int[] nums, int k) {
        // 1. 统计每个元素的出现频率
        Map<Integer, Integer> freqMap = new HashMap<>();
        for (int num : nums) {
            freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);
        }

        // 2. 使用一个最小堆来维护前 k 个频率最高的元素
        // Java 中使用 PriorityQueue 创建最小堆，按照频率排序
        PriorityQueue<Map.Entry<Integer, Integer>> minHeap =
                new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());

        // 3. 遍历频率映射，维护堆的大小为 k
        for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {
            minHeap.offer(entry);
            // 如果堆的大小超过 k，移除堆顶（即频率最小的元素）
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }

        // 4. 将堆中的元素提取到结果列表中
        List<Integer> result = new ArrayList<>();
        while (!minHeap.isEmpty()) {
            result.add(minHeap.poll().getKey());
        }
        //注意list转int[]的方法  不会自动拆箱 但是可以自动装箱  用流先转为int 再转为数组
        return result.stream().mapToInt(Integer::intValue).toArray();
    }
}
